package pl.edu.pw.elka.tinyrepo.dataserver;

import java.net.UnknownHostException;
import java.rmi.RemoteException;
import java.rmi.registry.LocateRegistry;
import java.rmi.registry.Registry;
import java.rmi.server.UnicastRemoteObject;

import pl.edu.pw.elka.tinyrepo.dataserver.server.*;
import pl.edu.pw.elka.tinyrepo.gate.server.GateFacade;
// FIXME zaimplementowac

/**
 * Main serwera danych.
 * 
 * @author Piotr Jarosik
 */
public class DataServerMain {
   static final String APP_STRING = "data server v.0.1";
   
   /**
    * Wypisuje info o bramie na standardowe wyjscie.
    * 
    * @param args
    * @throws UnknownHostException 
    */
   static void printDSInfo(DataServerArgumentLineParser args) throws UnknownHostException {
     System.out.println(APP_STRING);
     System.out.println("port: "+args.getPort());
     System.out.println("working directory: " + args.getDirectory());
   }
   
//   /**
//    * Zabawa z RMI. 
//    * 
//    * @param gateName
//    * @return zdalny obiekt do bramy
//    */
//   static GateFacade registerInGate(String gateName, DataServerFacadeImpl ds) {
//      // TODO wlaczyc security manager'a
//      try { // FIXME rejestr uruchamiany na porcie 10001
//         Registry r = LocateRegistry.getRegistry(gateName, 0); // uzyskiwanie dostepu do rejestru RMI
//         GateFacade f = (GateFacade)r.lookup("gate"); // TODO sparametryzowac 
//         DataServerFacade df = (DataServerFacade)UnicastRemoteObject.exportObject(ds, 0);
//         
//         f.register(df); // rejestracja w bramie
//         return f;
//      } catch (Exception e) {
//         System.err.println("Couldn't connect with gate");
//         System.exit(-1);
//      }
//      return null;
//   }
   
   /**
    * @param args
    * @throws UnknownHostException 
    */
   public static void main(String[] args) throws UnknownHostException {
      DataServerArgumentLineParser dsArgs = new DataServerArgumentLineParser();
      try {
         dsArgs.parse(args); // pobieranie argumentow
      }
      catch (Exception e) {
         e.printStackTrace();
      }
      printDSInfo(dsArgs); // wypisanie info o serwerze
      DataServer ds = null;
      try { 
         Registry r = LocateRegistry.getRegistry(dsArgs.getGateName(), 0); // uzyskiwanie dostepu do rejestru RMI
         GateFacade f = (GateFacade)r.lookup("gate"); // TODO sparametryzowac 
         
         ds = new DataServer(dsArgs.getPort(), dsArgs.getDirectory(), f); // utworzenie serwera danych 
         // utworzenie stuba typu DataServerFacade
         DataServerFacade df = (DataServerFacade)UnicastRemoteObject.exportObject(new DataServerFacadeImpl(ds), 0);
         f.register(df, dsArgs.getPort()); // rejestracja w bramie
      } catch (Exception e) {
         System.err.println("Couldn't connect with gate");
         e.printStackTrace();
         System.exit(-1);
      }
      ds.start();
   }
   
}
